/*
 * Copyright 2011-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0.
 * See `LICENSE` in the project root for license information.
 */

package me.ijleex.platform.framework.mybatis.mapper;

import java.util.List;

import me.ijleex.platform.framework.constant.Constants;
import me.ijleex.platform.framework.entity.EntitySupport;
import me.ijleex.platform.framework.util.StringUtils;

/**
 * MyBatis Mapper
 *
 * @param <T> 实体类型
 * @author liym
 * @see org.apache.ibatis.scripting.xmltags.XMLScriptBuilder
 * @see org.apache.ibatis.binding.MapperProxy#invoke(Object, java.lang.reflect.Method, Object[])
 * @see org.apache.ibatis.session.defaults.DefaultSqlSession
 * @see org.apache.ibatis.executor.BaseExecutor
 * @see org.apache.ibatis.executor.statement.PreparedStatementHandler
 * @see org.apache.ibatis.logging.jdbc.ResultSetLogger
 * @since 2019-12-29 21:27 新建
 */
public interface MyBatisMapper<T extends EntitySupport> {

    /**
     * 新增
     *
     * @param entity 实体
     * @return 新增数据的条数
     */
    int insert(T entity);

    /**
     * 批量新增
     *
     * @param entityList 实体
     * @return 新增数据的条数
     */
    int insertBatch(List<T> entityList);

    /**
     * 删除
     *
     * @param id 实体 ID
     * @return 删除数据的条数
     */
    int deleteById(Long id);

    /**
     * 批量删除
     *
     * @param idArray 实体 ID
     * @return 删除数据的条数
     */
    int deleteBatch(Long[] idArray);

    /**
     * 删除
     *
     * @param ids 实体 ID，如果有多个，请用逗号（,）分隔
     * @return 删除数据的条数
     * @since 2020-01-05 15:06
     */
    default int delete(String ids) {
        if (ids == null || ids.isEmpty()) {
            return 0;
        }

        ids = ids.trim();
        if (ids.contains(Constants.DELIMITER)) {
            Long[] idArray = StringUtils.tokenizeToLongArray(ids, Constants.DELIMITER);
            return this.deleteBatch(idArray);
        } else {
            return this.deleteById(Long.parseLong(ids));
        }
    }

    /**
     * 更新
     *
     * @param entity 实体
     * @return 更新数据的条数
     */
    int update(T entity);

    /**
     * 查询列表（支持分页）
     *
     * @param entity 实体
     * @return 结果
     */
    List<T> selectList(T entity);

    /**
     * 根据 ID，查询实体
     *
     * @param id 实体 ID
     * @return 结果
     */
    T selectById(Long id);

    /**
     * 查询
     *
     * @param entity 实体
     * @return 结果
     */
    T select(T entity);

    /**
     * 查询数据条数
     *
     * @param entity 实体
     * @return 结果
     */
    int selectCount(T entity);

}
